package gui;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;

import javax.swing.JTable;
import javax.swing.JScrollPane;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.JButton;

import negocio.Recado;
import negocio.RecadoControlador;
import negocio.Tarea;
import negocio.TareaControlador;
import negocio.Usuario;
import negocio.UsuarioControlador;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import com.toedter.calendar.JDateChooser;

import javax.swing.JLabel;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.ListSelectionModel;

public class Recados extends JFrame {

	private JPanel contentPane;
	private JTable table;
	private DefaultTableModel model = new DefaultTableModel();
	private ArrayList<Recado> recados = new ArrayList<Recado>();
	private Usuario usuario;
	private Recados padreRecados=this;
	private JComboBox comboEstado;
	private JComboBox comboRemitente;
	private JButton btnBuscar;
	private JButton btnEnviados;
	private JDateChooser dateChooser;
	private JDateChooser dateChooser_1;
	private RecadoVer recadoVer = null;
	private RecadosEnviados recadosEnviados = null;

	public void nullRecadosVer()
	{
		recadoVer = null;
	}
	
	public void nullRecadosEnviados()
	{
		recadosEnviados = null;	
	}
	
	public void llenarTabla()
	{
		model.setRowCount(0);
		ArrayList <String> fila = new ArrayList<String>();
		recados = RecadoControlador.getAll();
		ArrayList<String> encabezado = new ArrayList<String>();
		encabezado.add("Fecha");
		encabezado.add("Hora Envio");
		encabezado.add("Remitente");
		encabezado.add("Asunto");
		encabezado.add("Estado");
		model.setColumnIdentifiers(encabezado.toArray());
		
		
		filtrarPorDestinatario(recados);
		filtrarPorEstado(recados, comboEstado);
		filtrarPorRemitente(recados, comboRemitente);
		filtrarPorFechaRecepcion(recados, dateChooser, dateChooser_1);	
		filtrarEliminados(recados);
		//recados=RecadoControlador.ordenar(recados);
		
		for(Recado r: recados)
		{
			if(r.getReceptor().getDni().equals(usuario.getDni()))
			{
				fila.add(r.getFechaRecado().toString());
				fila.add(r.getHora().toString());
				fila.add(r.getRemitente().getNombre()+" "+r.getRemitente().getApellido());
				if(r.getAsunto()!=null)
					fila.add(r.getAsunto());
				else
					fila.add("(sin asunto)");
				fila.add(r.getEstado());
				
				model.addRow(fila.toArray());
				fila.removeAll(fila);
			}
		}
		table.setModel(model);
		table.getColumnModel().getColumn(0).setPreferredWidth(70);
		table.getColumnModel().getColumn(0).setMinWidth(70);
		table.getColumnModel().getColumn(0).setMaxWidth(70);
		table.getColumnModel().getColumn(1).setPreferredWidth(70);
		table.getColumnModel().getColumn(1).setMinWidth(70);
		table.getColumnModel().getColumn(1).setMaxWidth(70);
		table.getColumnModel().getColumn(2).setPreferredWidth(105);
		table.getColumnModel().getColumn(2).setMinWidth(105);
		table.getColumnModel().getColumn(2).setMaxWidth(300);
		table.getColumnModel().getColumn(3).setPreferredWidth(140);
		table.getColumnModel().getColumn(3).setMinWidth(140);
		table.getColumnModel().getColumn(4).setMinWidth(50);
		table.getColumnModel().getColumn(4).setMaxWidth(10000);
		table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
	}
	
	private void filtrarPorDestinatario(ArrayList<Recado> recados) 
	{
		Usuario destino = this.usuario;
		for(int i = 0; i<recados.size();)
		{
			if(!recados.get(i).getReceptor().equals(destino))
			{
				recados.remove(i);
			}
			else
				 i++;
		}
	}
	
	private void filtrarEliminados(ArrayList<Recado> recados) 
	{
		for(int i = 0; i<recados.size();)
		{
			if(recados.get(i).getEliminadoRecibidos()==true)
			{
				recados.remove(i);
			}
			else
				 i++;
		}
	}
	
	private void filtrarPorRemitente(ArrayList<Recado> recados, JComboBox comboRemitente)
	{
		if(comboRemitente.getSelectedIndex()==0)
		{
			return;
		}
		else
		{
			if(comboRemitente.getSelectedItem().equals("Sistema"))
			{
				for(int i = 0; i<recados.size();)
				{
					if(!recados.get(i).getRemitente().getNickname().equals("Sistema"))
					{
						recados.remove(i);
					}
					else
						 i++;
				}
			}
			else
			{
				Usuario remitente = (Usuario) comboRemitente.getSelectedItem();
				for(int i = 0; i<recados.size();)
				{
					if(!recados.get(i).getRemitente().equals(remitente))
					{
						recados.remove(i);
					}
					else
						 i++;
				}
			}
		}
	}

	private void filtrarPorEstado(ArrayList<Recado> recados, JComboBox comboEstado) 
	{
		if(comboEstado.getSelectedIndex()==0)
		{
			return;
		}
		else
		{
			String estado = (String) comboEstado.getSelectedItem();
			for(int i = 0; i<recados.size();)
			{
				if(recados.get(i).getEstado().compareToIgnoreCase(estado)!=0)
				{
					recados.remove(i);
				}	
				else
					 i++;
			}
		}
	}
	
	@SuppressWarnings("deprecation")
	public void filtrarPorFechaRecepcion(ArrayList<Recado> recados, JDateChooser fechaDesde, JDateChooser fechaHasta)
	{
		if(fechaDesde.getDate()==null && fechaHasta.getDate()==null)
		{
			return;
		}

		else if(fechaDesde.getDate()==null)
		{
		    java.sql.Date fechaMax = new java.sql.Date(fechaHasta.getDate().getYear(), fechaHasta.getDate().getMonth(), fechaHasta.getDate().getDate());
		    
			for(int i = 0; i<recados.size();)
			{
				if(recados.get(i).getFechaRecado().after(fechaMax))
				{
					recados.remove(i);
				}	
				else
					 i++;
			}
		}
		else if(fechaHasta.getDate()==null)
		{
		    java.sql.Date fechaMin = new java.sql.Date(fechaDesde.getDate().getYear(), fechaDesde.getDate().getMonth(), fechaDesde.getDate().getDate());
		    
			for(int i = 0; i<recados.size();)
			{
				if(recados.get(i).getFechaRecado().before(fechaMin))
				{
					recados.remove(i);
				}	
				else
					 i++;
			}
		}
		else
		{
		    java.sql.Date fechaMax = new java.sql.Date(fechaHasta.getDate().getYear(), fechaHasta.getDate().getMonth(), fechaHasta.getDate().getDate());
		    java.sql.Date fechaMin = new java.sql.Date(fechaDesde.getDate().getYear(), fechaDesde.getDate().getMonth(), fechaDesde.getDate().getDate());
		    
			for(int i = 0; i<recados.size();)
			{
				if(recados.get(i).getFechaRecado().after(fechaMax))
				{
					recados.remove(i);
				}	
				
				else if(recados.get(i).getFechaRecado().before(fechaMin))
				{
					recados.remove(i);
				}
				else
					 i++;
			}
		}
	}

	private void llenarCombos()
	{
		llenarComboEstado();
		lenarComboRemitente();
	}
	
	private void llenarComboEstado()
	{
		comboEstado.removeAllItems();
		comboEstado.addItem("No leido");
		comboEstado.addItem("Leido");
		comboEstado.insertItemAt("", 0);
		comboEstado.setSelectedIndex(0);
	}
	
	private void lenarComboRemitente()
	{
		ArrayList<Usuario> remitentes = UsuarioControlador.getAll();
		comboRemitente.removeAllItems();
		comboRemitente.addItem("Sistema");
		for(Usuario u : remitentes)
		{
				comboRemitente.addItem(u);
		}
		comboRemitente.insertItemAt("", 0);
		comboRemitente.setSelectedIndex(0);
	}
	

	public Recados(Principal padre, Usuario usuario) {
		setTitle("Recados");
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e){
				padre.nullrecados();
				dispose();
			}
		});
		this.usuario=usuario;
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setBounds(270, 220, 545, 457);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JPanel panel = new JPanel();
		panel.setBorder(new TitledBorder(null, "Resultados de busqueda", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panel.setBounds(10, 132, 500, 214);
		contentPane.add(panel);
		panel.setLayout(null);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(6, 16, 484, 191);
		panel.add(scrollPane);
		
		table = new JTable(){
			@Override
			public boolean isCellEditable(int row, int colum)
			{
				return false;
			}
		};
		scrollPane.setViewportView(table);
		table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
				
		JButton btnVerRecado = new JButton("Ver recado");
		btnVerRecado.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				
				if(table.getSelectedRow()!=-1)
				{
					if(recadoVer==null)
					{
						recadoVer = new RecadoVer(usuario, recados.get(table.getSelectedRow()),padreRecados, null);
					}
					recadoVer.setVisible(true);
				}
			}
		});
		btnVerRecado.setBounds(119, 357, 99, 23);
		contentPane.add(btnVerRecado);
		
		JButton btnNuevoRecado = new JButton("Nuevo recado");
		btnNuevoRecado.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				RecadosCrear recadosCrear= new RecadosCrear(usuario, padreRecados, null);
				recadosCrear.setVisible(true);				
			}
		});
		btnNuevoRecado.setBounds(10, 357, 99, 23);
		contentPane.add(btnNuevoRecado);
		
		JButton btnSalir = new JButton("Salir");
		btnSalir.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				padre.nullrecados();
				dispose();
			}
		});
		btnSalir.setBounds(430, 385, 89, 23);
		contentPane.add(btnSalir);
		
		JPanel panel_2 = new JPanel();
		panel_2.setBorder(new TitledBorder(null, "Busqueda", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panel_2.setBounds(10, 11, 501, 110);
		contentPane.add(panel_2);
		panel_2.setLayout(null);
		
		JPanel panel_1 = new JPanel();
		panel_1.setBounds(10, 47, 237, 52);
		panel_2.add(panel_1);
		panel_1.setLayout(null);
		panel_1.setBorder(new TitledBorder(null, "Busqueda por fecha", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		
		dateChooser = new JDateChooser();
		dateChooser.setBounds(42, 16, 67, 20);
		panel_1.add(dateChooser);
		
		dateChooser_1 = new JDateChooser();
		dateChooser_1.setBounds(153, 16, 67, 20);
		panel_1.add(dateChooser_1);
		
		JLabel label = new JLabel("Desde");
		label.setBounds(6, 22, 38, 14);
		panel_1.add(label);
		
		JLabel label_1 = new JLabel("Hasta");
		label_1.setBounds(119, 22, 38, 14);
		panel_1.add(label_1);
		
		JLabel label_2 = new JLabel("Estado");
		label_2.setBounds(10, 19, 46, 14);
		panel_2.add(label_2);
		
		comboEstado = new JComboBox();
		comboEstado.setBounds(90, 16, 139, 20);
		panel_2.add(comboEstado);
		
		comboRemitente = new JComboBox();
		comboRemitente.setBounds(354, 16, 139, 20);
		panel_2.add(comboRemitente);
		
		JLabel label_3 = new JLabel("Usuario Remitente");
		label_3.setBounds(255, 19, 89, 14);
		panel_2.add(label_3);
		
		btnBuscar = new JButton("Buscar");
		btnBuscar.setBounds(356, 76, 139, 23);
		panel_2.add(btnBuscar);
		
		btnEnviados = new JButton("Ver Enviados");
		btnEnviados.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				if(recadosEnviados==null)
				{
					recadosEnviados = new RecadosEnviados(padreRecados, usuario);
				}
				recadosEnviados.setVisible(true);
				llenarTabla();
			}
		});
		btnEnviados.setBounds(228, 357, 99, 23);
		contentPane.add(btnEnviados);
		
		JButton button = new JButton("Borrar");
		button.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				if(table.getSelectedRow()!=-1)
				{
					RecadoControlador.cambiarEstadoRecibidos(recados.get(table.getSelectedRow()), true);
					llenarTabla();
					if(table.getRowCount()>0)
						table.changeSelection(0, 0, false, false);
				}
			}
		});
		button.setBounds(337, 357, 99, 23);
		contentPane.add(button);
		btnBuscar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				llenarTabla();
			}
		});
		llenarCombos();
		llenarTabla();
		
		if (recados.size()>0)
		{
			table.changeSelection(0, 0, false, false);
		}
		else
		{
			btnVerRecado.setVisible(false);	
		}
	}
}
